#include "struct.h"

/*****************************************
**  Nom :	echange_FIFO_out			**
**	Nom du fichier : echange_FIFO_out	**
**	Description : prend la premiere 
	carte d'une FIFO et la transfert
	en derniere place dans une autre
	FIFO								**
**										**
**										**
**	Date:	18/08/2014				    **
**  Statut:Closed						**
*****************************************/

/*************************************************
**  Zone de déclaration des Fonctions PUBLIC    **
*************************************************/

/*************************************************************************
**  echange_FIFO_in		                		    					**
**  Description de la fonction	: prend la premiere 
	carte d'une FIFO et la transfert
	en derniere place dans une autre
	FIFO														        **
**																		**
**	Entrees : FIFO_PAQUET --> FIFO du paquet "donneur" de la carte		**
**			  FIFO_PAQUET --> FIFO du paquet "receveur" de la carte		**
**																		**
**	Sorties : int --> si -1=Erreur // si 0-OK							**
**									                                    **
**									                                    **
**************************************************************************/
int echange_FIFO_out(FIFO_PAQUET *paquet_donneur, FIFO_PAQUET *paquet_receveur)
{
	S_CARTE *copie_nouvelle_carte=NULL,*copie=NULL,*courant=NULL,*precedent=NULL;
	
	if(paquet_donneur->carte_in==NULL)
	{
		printf("echange_FIFO_out : erreur, les deux paquets sont vides !\n");
		return -1;
	}
	if(paquet_donneur->carte_in!=NULL && paquet_receveur->carte_in!=NULL && paquet_receveur->carte_out!=NULL) //paquet receveur non vide
	{
		//printf("echange_FIFO_out : début échange carte du paquet cible !\n");
		copie_nouvelle_carte=paquet_donneur->carte_in;
		paquet_donneur->carte_in=paquet_donneur->carte_in->carte_suivante;
		
		courant=paquet_donneur->carte_in;
		while(courant->carte_suivante!=NULL)
		{
			precedent=courant;
			courant=courant->carte_suivante;
		}
		paquet_donneur->carte_out=precedent;
		paquet_donneur->carte_out->carte_suivante=NULL;
	
		paquet_receveur->carte_out->carte_suivante=copie_nouvelle_carte;
		paquet_receveur->carte_out=copie_nouvelle_carte;
		paquet_receveur->carte_out->carte_suivante=NULL;
		//printf("echange_FIFO_out : fin échange carte du paquet cible !\n");
		return 0;
	}
	if(paquet_donneur->carte_in!=NULL && paquet_receveur->carte_in==NULL && paquet_receveur->carte_out==NULL) //paquet receveur est vide
	{
		//printf("echange_FIFO_out : début échange 1ere carte du paquet cible !\n");
		copie=paquet_donneur->carte_in;
		
		paquet_donneur->carte_in=paquet_donneur->carte_in->carte_suivante;
		
		paquet_receveur->carte_in=copie;
		paquet_receveur->carte_out=copie;
		
		paquet_receveur->carte_in->carte_suivante=NULL;
		paquet_receveur->carte_out->carte_suivante=NULL;
		//printf("echange_FIFO_out : début échange 1ere carte du paquet cible !\n");
		return 0;
	}
	return -1;
}

